ps(本系列文章將引用ToDo List的專案去演示,抱歉稍後補上專案GitHub連結)
利用multer將圖片存在後端storage,取得圖片儲存的相對路徑,最後EJS在 img tag的src路徑去引入該圖片
優點:
multer(opt)這個方法的opt接受指定的key value pair物件,其中兩個我們會用來指定圖片存放位置的就是dest和storage這兩個。
dest就是destination(目的地)的簡稱,它的值要是string來指定存放路徑,在之前我已經用express.static(__dirname + '/public')去告訴express我靜態檔案是放在public資料夾下面,__dirname就是我的env記錄著我專案根目錄的位置,這樣前後組合起來就是一個絕對路徑。
var upload = multer({dest: "public/images/uploads"})
storage有分存MemoryStorage或DiskStorage
var storage = multer.memoryStorage()
var upload = multer({ storage: storage })
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'public')
},
filename: function (req, file, cb) {
cb(null, file.filename: + '-' + Date.now())
}
})
const upload = multer({storage: storage})
一般來說,把圖片存在storage後,是無法直接用預覽器去預覽圖片,這樣對於管理不是很友善,所以我們可以引用Node原生的方式fs.rename()來讓storage中的圖片可以被預覽。
const fs = require('fs')
這裡我們透過fs.rename()的方式修改了圖片存放的路徑,以及成功則執行callback回傳成功訊息。
表達式: fs.rename(oldPath, newPath, callback)
第一個參數oldname即是該圖的原路徑,第二個newPath則是新路徑,我們將它指定在一個變數中方便查看,第三個參數即是執行後的callback成功訊息。
let newPath = `public/images/uploads/${req.file.originalname}`
fs.rename(req.file.path, newPath, () => {
res.json({result: 'image uploaded successful'})
})
var imgPath = {image: `/images/uploads/${req.file.originalname}`}
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("todolist");
dbo.collection("images").insertOne(imgPath, function(err, res) {
if (err) throw err;
console.log("1 image inserted");
db.close();
});
});
現在我們已經可以把圖片存放好,並且DB也將圖片的相對位置記錄和規劃,DB只負責記錄網址就可以了。減輕不少DB的負擔。
<img src="<%= doc.image %>"/>
終於可以理解為什麼要把圖片存在storage的好處,實作下來我發現,其實不一定要把圖片存放在本機中,也可以用託管的方式把圖片存在第三方的空間,例如AWS有個S3的圖片儲存空間。
下一篇,我們把圖片託管在第三方空間。